class A:
    def f(self,n):
        print(self,n)
        print("我是self的方法")
a = A()
a1 = A()
# print(a) # a? 这会是什么内容？ 对象的地址值
# print("================")

# 是哪个对象调用的self参数的方法，那么传入的self就是那个对象
# a.f() # 有个形参 没有传 TypeError: f() missing 1 required positional argument: 'n'
# a.f(1)
"""
<__main__.A object at 0x000001E642890220> 1
我是self的方法
"""
# print(a1)
"""
<__main__.A object at 0x000001E6428901C0>
"""
# 类调用必须传入对象 不会自动传入对象 自己手动传入对象
"""print("************")
A.f(a,1)
A.f(a1,2)"""

# 绑定类的方法是给类用的
class B:
    @classmethod
    def f(cls,n):
        """
        cls 和self是一个东西
        为什么有的是self，有的是cls呢？
        因为你用了类装饰器 ，那么方法里的形参就会自动由原来的self变成cls
        :param n:
        :return:
        """
        print(cls,n)
        print("我是绑定的方法")

    @classmethod
    def f1(self,n):
        print(n)
        print("我是绑定的方法2")

    def f2(self,n):
        print(self,n)
        print("我不是绑定的方法，你可别搞错了")

"""print(B) # <class '__main__.B'>
print("================")"""
# B.f(2) # cls n 最少两个形参，但是现在不需要传对象了，因为我用了classmethod
# B.f2(2,2) # 没有使用classmethod的方法，你就必须要将对象传进去才可以
# B.f1(3)
# 一般不这样用 绑定给类的方法 给对象用
"""b = B()
print(b)
b.f(1)"""
B.f1(5)

class C:
    @staticmethod # 标记了这个装饰器的，就是一个纯粹的函数
    def f(n):
        print(n)
        print("我是非绑定方法/静态方法")

# 直接通过类是可以调用的
C.f(2)

# 对象也可以调用的
c = C()
c.f(2)

























